package com.cjl.interview150.bitOperation;

import org.junit.jupiter.api.Test;

public class bitOperationPractice {
    /**
     * 67. 二进制求和
     *
     * @param a
     * @param b
     * @return
     */
    public String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int n = Math.max(a.length(), b.length());
        int carry = 0;
        for (int i = 0; i < n; i++) {
            // 从后向前取字符串中的数字
            carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
            carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
            // 将将结果加入字符串
            sb.append((char) (carry % 2 + '0'));
            // 计算进位数
            carry /= 2;
        }
        // 最后再计算一次是否需要进位
        if (carry > 0) {
            sb.append('1');
        }
        //反转返回
        sb.reverse();
        return sb.toString();
    }

    /**
     * 190. 颠倒二进制位
     * @param n
     * @return
     */
    public int reverseBits(int n) {
        int res = 0;
        for (int i = 0; i < 32 && n != 0; i++) {
            res |= (n & 1) << (31 - i);
            // n无符号后移
            n >>>= 1;
        }
        return res;
    }

    /**
     *136. 只出现一次的数字
     * @param nums
     * @return
     */
    public int singleNumber(int[] nums) {
        /*
        * 任何数字与本身异或都是0，与0异或都是本身
        * */
        int res = 0;
        for (int num : nums) {
            res ^= num;
        }
        return res;
    }

    @Test
    public void test() {
        System.out.println(reverseBits(43261596));
    }
}
